package Month11.Day23;

public class T0 {
/*
1:什么是多线程编程？什么时候使用？
如果在一个进程中同时运行了多个线程，用来完成不同的工作，则称之为“多线程”
多个线程交替占用CPU资源，而非真正的并行执行.
使用：多线程的使用主要是用来处理程序“在一部分上会阻塞”，“在另一部分上需要持续运行”的场合。

 */

/*
2.为什么wait(),notify()和notifyall()函数定义在Object类里面?
notify、notifyAll被设计在Object类中的原因是，JAVA提供的锁是对象级的而不是线程级的，每个对象都有个锁，
而线程是可以获得这个对象的。因此线程需要等待某些锁，那么只要调用对象中的wait()方法便可以了。而wait()方法如果定义
在Thread类中的话，那么线程正在等待的是哪个锁就不明确了。这也就是说wait，notify和notifyAll都是锁级别的操作，所以把他们定
义在Object类中是因为锁是属于对象的原因。

 */


/*
3.wait()方法和sleep()方法有什么不同？
1.相同点：
（1）这两个方法都能使线程进入阻塞状态
2.不同点：
（1）sleep()方法是Thread类中的静态方法；而wait()方法是Object类中的方法；
（2）sleep()方法可以在任何地方调用；而wait()方法只能在同步代码块或同步方法中使用(即使用synchronized关键字修饰的)；
（3）这两个方法都在同步代码块或同步方法中使用时，sleep()方法不会释放同步监视器；而wait()方法则会释放同步监视器；
 */

/*
4.Thread和Runnable有什么不同？
(1):如果一个类继承Thread，则不适合资源共享。但是如果实现了Runable接口的话，则很容易的实现资源共享。
(2):main函数，实例化线程对象也有所不同，
extends Thread ：t.start();
implements Runnable ： new Thread(t).start();
(3):使用Runnable，增加程序的健壮性，代码可以被多个线程共享，代码和数据独立
(4):线程池只能放入实现Runable或callable类线程，不能直接放入继承Thread的类

 */

/*
5.我可以重写start()方法么？
可以 重写Java中Thread 类的start()方法。必须调用super.start()方法创建一个新线程，并且需要在该新创建的线程中调用run() 方法。
如果直接从start()方法内部调用run() 方法，则它可以作为常规方法在实际线程中执行，而不是在新线程中执行。
Demo:
public class ThreadTest {
   public static void main(String[] args) {
      MyThread t = new MyThread();
      t.start();
   }
}
class MyThread extends Thread {
   @Override
   public void start() { // overriding the start() method
      System.out.println("Overriding a start() method");
      super.start();
   }
 */


}
